package com.cencat.driver.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.driver.entity.DeliveryTask;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 配送任务服务接口
 * 
 * @author cencat
 * @since 2024-01-01
 */
public interface DeliveryTaskService extends IService<DeliveryTask> {

    /**
     * 根据任务编号查询配送任务
     * 
     * @param taskCode 任务编号
     * @param tenantId 租户ID
     * @return 配送任务
     */
    DeliveryTask getByTaskCode(String taskCode, Long tenantId);

    /**
     * 根据司机ID查询配送任务列表
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 配送任务列表
     */
    List<DeliveryTask> getByDriverId(Long driverId, Long tenantId);

    /**
     * 根据订单ID查询配送任务列表
     * 
     * @param orderId 订单ID
     * @param tenantId 租户ID
     * @return 配送任务列表
     */
    List<DeliveryTask> getByOrderId(Long orderId, Long tenantId);

    /**
     * 根据任务状态查询配送任务列表
     * 
     * @param status 任务状态
     * @param tenantId 租户ID
     * @return 配送任务列表
     */
    List<DeliveryTask> getByStatus(Integer status, Long tenantId);

    /**
     * 查询司机的待处理任务列表
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 待处理任务列表
     */
    List<DeliveryTask> getPendingTasksByDriverId(Long driverId, Long tenantId);

    /**
     * 查询未分配的任务列表
     * 
     * @param tenantId 租户ID
     * @return 未分配任务列表
     */
    List<DeliveryTask> getUnassignedTasks(Long tenantId);

    /**
     * 分页查询配送任务列表
     * 
     * @param current 当前页
     * @param size 每页大小
     * @param taskCode 任务编号（模糊查询）
     * @param driverId 司机ID
     * @param orderId 订单ID
     * @param status 任务状态
     * @param priority 优先级
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param tenantId 租户ID
     * @return 分页结果
     */
    IPage<DeliveryTask> getPageList(Long current, Long size, String taskCode, Long driverId, Long orderId,
                                   Integer status, Integer priority, LocalDateTime startTime, LocalDateTime endTime, Long tenantId);

    /**
     * 创建配送任务
     * 
     * @param deliveryTask 配送任务信息
     * @return 是否成功
     */
    boolean createTask(DeliveryTask deliveryTask);

    /**
     * 更新配送任务信息
     * 
     * @param deliveryTask 配送任务信息
     * @return 是否成功
     */
    boolean updateTask(DeliveryTask deliveryTask);

    /**
     * 删除配送任务
     * 
     * @param id 任务ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean deleteTask(Long id, Long tenantId);

    /**
     * 批量删除配送任务
     * 
     * @param ids 任务ID列表
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchDeleteTasks(List<Long> ids, Long tenantId);

    /**
     * 分配任务给司机
     * 
     * @param id 任务ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean assignToDriver(Long id, Long driverId, Long tenantId);

    /**
     * 批量分配任务给司机
     * 
     * @param taskIds 任务ID列表
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchAssignToDriver(List<Long> taskIds, Long driverId, Long tenantId);

    /**
     * 司机接受任务
     * 
     * @param id 任务ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean acceptTask(Long id, Long driverId, Long tenantId);

    /**
     * 司机拒绝任务
     * 
     * @param id 任务ID
     * @param driverId 司机ID
     * @param rejectReason 拒绝原因
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean rejectTask(Long id, Long driverId, String rejectReason, Long tenantId);

    /**
     * 开始配送
     * 
     * @param id 任务ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean startDelivery(Long id, Long driverId, Long tenantId);

    /**
     * 完成配送
     * 
     * @param id 任务ID
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean completeDelivery(Long id, Long driverId, Long tenantId);

    /**
     * 更新任务状态
     * 
     * @param id 任务ID
     * @param status 任务状态
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean updateStatus(Long id, Integer status, Long tenantId);

    /**
     * 批量更新任务状态
     * 
     * @param ids 任务ID列表
     * @param status 任务状态
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean batchUpdateStatus(List<Long> ids, Integer status, Long tenantId);

    /**
     * 更新任务位置信息
     * 
     * @param id 任务ID
     * @param longitude 经度
     * @param latitude 纬度
     * @param address 地址
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean updateLocation(Long id, Double longitude, Double latitude, String address, Long tenantId);

    /**
     * 生成任务编号
     * 
     * @param tenantId 租户ID
     * @return 任务编号
     */
    String generateTaskCode(Long tenantId);

    /**
     * 验证任务编号唯一性
     * 
     * @param taskCode 任务编号
     * @param excludeId 排除的任务ID（用于更新时检查）
     * @param tenantId 租户ID
     * @return 是否唯一
     */
    boolean validateTaskCodeUniqueness(String taskCode, Long excludeId, Long tenantId);

    /**
     * 查询超时未处理的任务
     * 
     * @param timeoutMinutes 超时分钟数
     * @param tenantId 租户ID
     * @return 超时任务列表
     */
    List<DeliveryTask> getTimeoutTasks(Integer timeoutMinutes, Long tenantId);

    /**
     * 处理超时任务
     * 
     * @param tenantId 租户ID
     * @return 处理结果
     */
    Map<String, Object> handleTimeoutTasks(Long tenantId);

    /**
     * 智能派单
     * 
     * @param taskId 任务ID
     * @param tenantId 租户ID
     * @return 派单结果
     */
    Map<String, Object> intelligentDispatch(Long taskId, Long tenantId);

    /**
     * 批量智能派单
     * 
     * @param taskIds 任务ID列表
     * @param tenantId 租户ID
     * @return 派单结果
     */
    Map<String, Object> batchIntelligentDispatch(List<Long> taskIds, Long tenantId);

    /**
     * 获取任务统计信息
     * 
     * @param tenantId 租户ID
     * @return 统计信息
     */
    Map<String, Object> getStatistics(Long tenantId);

    /**
     * 获取司机任务统计信息
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 统计信息
     */
    Map<String, Object> getDriverTaskStatistics(Long driverId, Long tenantId);

    /**
     * 获取今日任务统计
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 今日任务统计
     */
    Map<String, Object> getTodayStatistics(Long driverId, Long tenantId);

    /**
     * 导出任务信息
     * 
     * @param taskCode 任务编号（模糊查询）
     * @param driverId 司机ID
     * @param orderId 订单ID
     * @param status 任务状态
     * @param priority 优先级
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param tenantId 租户ID
     * @return 导出数据
     */
    List<Map<String, Object>> exportTasks(String taskCode, Long driverId, Long orderId,
                                         Integer status, Integer priority, LocalDateTime startTime, LocalDateTime endTime, Long tenantId);

    /**
     * 导入任务信息
     * 
     * @param taskList 任务信息列表
     * @param tenantId 租户ID
     * @return 导入结果
     */
    Map<String, Object> importTasks(List<Map<String, Object>> taskList, Long tenantId);

    /**
     * 任务路径优化
     * 
     * @param driverId 司机ID
     * @param tenantId 租户ID
     * @return 优化结果
     */
    Map<String, Object> optimizeTaskRoute(Long driverId, Long tenantId);

    /**
     * 获取任务执行轨迹
     * 
     * @param taskId 任务ID
     * @param tenantId 租户ID
     * @return 执行轨迹
     */
    List<Map<String, Object>> getTaskTrajectory(Long taskId, Long tenantId);

    /**
     * 任务异常处理
     * 
     * @param taskId 任务ID
     * @param exceptionType 异常类型
     * @param exceptionDesc 异常描述
     * @param handleSuggestion 处理建议
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean handleTaskException(Long taskId, Integer exceptionType, String exceptionDesc, String handleSuggestion, Long tenantId);

    /**
     * 获取任务异常列表
     * 
     * @param tenantId 租户ID
     * @return 异常任务列表
     */
    List<DeliveryTask> getExceptionTasks(Long tenantId);

    /**
     * 任务重新派单
     * 
     * @param taskId 任务ID
     * @param newDriverId 新司机ID
     * @param reason 重新派单原因
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean reassignTask(Long taskId, Long newDriverId, String reason, Long tenantId);

    /**
     * 取消任务
     * 
     * @param taskId 任务ID
     * @param cancelReason 取消原因
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean cancelTask(Long taskId, String cancelReason, Long tenantId);

    /**
     * 恢复已取消的任务
     * 
     * @param taskId 任务ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    boolean restoreTask(Long taskId, Long tenantId);

    /**
     * 获取任务完成率统计
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param tenantId 租户ID
     * @return 完成率统计
     */
    Map<String, Object> getCompletionRateStatistics(String startDate, String endDate, Long tenantId);

    /**
     * 获取司机任务完成率统计
     * 
     * @param driverId 司机ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param tenantId 租户ID
     * @return 完成率统计
     */
    Map<String, Object> getDriverCompletionRateStatistics(Long driverId, String startDate, String endDate, Long tenantId);
}